跳到主要内容

ORM 的概念学习~

参考资料 阮一峰老师的 ORM 实例教程(少部分删减)

什么是 ORM

面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。

面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。

简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。

ORM 把数据库映射成对象。

数据库的表(table)     --> 类(class)
记录(record,行数据) --> 对象(object)
字段(field) --> 对象的属性(attribute)

举例来说,下面是一行 SQL 语句。

SELECT id, first_name, last_name, phone, birth_date, sex
FROM persons
WHERE id = 10

程序直接运行 SQL,操作数据库的写法如下。

res = db.execSql(sql);
name = res[0]["FIRST_NAME"];

改成 ORM 的写法如下。

p = Person.get(10);
name = p.first_name;

一比较就可以发现,ORM 使用对象,封装了数据库操作,因此可以不碰 SQL 语言。开发者只使用面向对象编程,与数据对象直接交互,不用关心底层数据库。

总结起来,ORM 有下面这些优点:

  • 数据模型都在一个地方定义,更容易更新和维护,也利于重用代码。
  • ORM 有现成的工具,很多功能都可以自动完成,比如数据消毒、预处理、事务等等。
  • 它迫使你使用 MVC 架构,ORM 就是天然的 Model,最终使代码更清晰。
  • 基于 ORM 的业务代码比较简单,代码量少,语义性好,容易理解。
  • 你不必编写性能不佳的 SQL。

但是,ORM 也有很突出的缺点:

  • ORM 库不是轻量级工具,需要花很多精力学习和设置。
  • 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
  • ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。

命名规定

1、一个类对应一张表。类名是单数,且首字母大写;表名是复数,且全部是小写。比如,表 books 对应类 Book

2、如果名字是不规则复数,则类名依照英语习惯命名,比如,表 mice 对应类 Mouse,表 people 对应类 Person

3、如果名字包含多个单词,那么类名使用首字母全部大写的骆驼拼写法,而表名使用下划线分隔的小写单词。比如,表 book_clubs 对应类 BookClub,表 line_items 对应类 LineItem

4、每个表都必须有一个主键字段,通常是叫做 id 的整数字段。外键字段名约定为单数的 表名 + 下划线 + id,比如 item_id 表示该字段对应 items 表的 id 字段。

MyBatis 与 ORM 的关系

参考资料 MyBatis不是完整的ORM框架? - 章鱼猫的回答 - 知乎 参考资料 MyBatis不是完整的ORM框架? - 潜龙勿用的回答 - 知乎

Mybatis 不是完整的 ORM,或者说只是半自动的 ORM,而 Hibernate 才是全自动 ORM 框架,而 Mybatis 是半自动的。hibernate 完全可以通过对象关系模型实现对数据库的操作,拥有完整的 JavaBean 对象与数据库的映射结构来自动生成 SQL。而 Mybatis 仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写 SQL 来实现和管理。

而且 MyBatis 没有实现 JPA,他和 ORM 框架的设计思路完全不一样。

MyBatis 是拥抱 SQL,而 ORM 则更靠近面向对象,不建议写 SQL,实在要写推荐你写 HQL 代替。 Mybatis是 SQL Mapper 框架而不是 ORM 框架,当然 ORM 和 Mybatis 都是持久层框架。